home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / ndiv.c < prev    next >
C/C++ Source or Header  |  1989-04-23  |  2KB  |  101 lines

  1. /* author: William F. Schelter
  2.    The following is an implementation of extended_div in C suitable
  3.    for a machine which can do 32 bit arithmetic.
  4.    The assembler output could be optimized, so that carry tests
  5.    were read from the condition codes
  6. */   
  7.  
  8. #include "arith.h"
  9.  
  10. /* #define ESTIMATE_LOG_QUOTIENT(x,l,d) estimate_logq(x,l,d) */
  11. #define ESTIMATE_LOG_QUOTIENT(x,l,d) 31
  12.  
  13. /*
  14. int  
  15. estimate_logq(x,l,div)
  16. unsigned int x,div,l;
  17. { unsigned int logq,w;
  18.   if (x==0) {w=0;x=l;} else {w=WSIZ;}
  19.   for(logq=0; logq < WSIZ ; logq+=1)
  20.     if ((div << logq) >= x)
  21.       break;
  22.   return 31;
  23.   return logq+w;}
  24.  
  25. */
  26.  
  27.  
  28. extended_div(divisor,dh,dl,q,r)
  29. unsigned int dh,dl , divisor, *q, *r;
  30. {   unsigned int Rh,Rl,temph,templ;
  31.     unsigned int Q;
  32.     int iter;
  33. #ifdef DEBUG 
  34.     char *op;
  35. #endif 
  36.     Rh=dh;
  37.     Rl=dl;
  38.  
  39.     /*  if (dh) printf("\n(di %d %d %d ",divisor,dh,dl); */
  40.  
  41.     NORMALIZE(Rh,Rl);
  42.     Q=0;
  43.     if (dh==0)
  44.       {*q=dl/divisor; *r=dl%divisor;
  45.        return;}
  46. #ifdef DEBUG 
  47.     printf("\n%d (Q %d %d) (R %d %d) %s" , -1,0,Q,Rh,Rl,"begin");
  48. #endif 
  49.     for (iter=ESTIMATE_LOG_QUOTIENT(dh,dl,divisor); iter >=0 ; iter-= 1)
  50.       {
  51.     /* assert(Q*divisor+R ==dividend); */
  52.     lshift(divisor,iter,temph,templ);
  53.     if ((int)Rh>=0)
  54.       {lsub(temph,templ,Rh,Rl);
  55. #ifdef DEBUG
  56.        op="add";
  57. #endif    
  58.        /*    lshift(1,iter,temph,templ);
  59.          ladd(temph,templ,Qh,Ql);
  60.          */    
  61.        /*     ladd(0,(1<<iter),Qh,Ql); */
  62.        Q=Q+ (1<<iter);
  63.      }
  64.     else
  65.       {
  66. #ifdef DEBUG        
  67.         op="sub"; 
  68. #endif
  69.         ladd(temph,templ,Rh,Rl);
  70.         /*      lshift(1,iter,temph,templ);
  71.             lsub(temph,templ,Qh,Ql);
  72.             */      
  73.         /*      lsub(0,(1<<iter),Qh,Ql); */
  74.         Q=Q- (1<<iter);
  75.       }
  76. #ifdef DEBUG           
  77.     printf("\n%d (Q %d %d) (R %d %d) %s" , iter,0,Q,Rh,Rl,op);
  78. #endif   
  79.       }
  80.     /* if (((int)Rl)< 0) {Ql--;Rl=Rl+divisor;} */
  81.     if (((int)Rl)< 0) {Q--;Rl=Rl+divisor;} 
  82.     KCLNORMALIZE(Rh,Rl);     
  83.     *q=Q;
  84.     /* *q=Ql; */
  85.     *r=Rl;
  86.     /* printf("%d %d)",*q,*r); 
  87.        fflush(stdout); */
  88.   } 
  89.  
  90. #ifndef VSSIZE
  91. try(h,d, h1,l1, qp, rp)
  92. unsigned int d, h, h1,l1,*qp, *rp;
  93. {
  94. extended_div (l1,h,d,qp,rp);
  95. }
  96. #endif
  97.  
  98.  
  99.  
  100.  
  101.